package com.slatch;

public class Unite extends Entite {

	private TypeUnite aType;
	private int aLvl;
	private TypeAttaque aAttaque;
	private int aDeplacement;
    private boolean dejaAttaque;
    private boolean dejaDeplacee;
	private int aPorteeDeplacement; // Coresspond au déplacement maximum que peut effectuer l'unité
	static final int EXPERIENCE_DONNEE_PAR_NIVEAU = 20;
	private int aExperience;
	private int aExperienceMax;
    private double aGain; //Compris entre 1 et 2, correspondant au pourcentage d'augmentation des caractéristique à chaque monté de niveau
    static final int pallierExperience =100;
    private int aPVMax;
    private int aPV;
    private int aDegats;
    private boolean isEvolvable;
	
    public Unite(final int pX,final int pY,final int pJoueur, final TypeUnite pType)
    {
       super(pX,pY,pJoueur);
       aType = pType;
       aGain = pType.getGain();
       aPVMax = pType.getPVMax();
       aPV = pType.getPVMax();
       aDeplacement = pType.getDeplacement();
       aLvl = 0;
       aExperience = 0;
       isEvolvable = false;
       aExperienceMax=100;
       
       for(TypeAttaque type : TypeAttaque.values()) {
    	   if(type.getNom().equals(pType.getAttaque())){
    		   aAttaque = type;
    		   break;
    	   }
       }
            
       aDegats = aAttaque.getDegats();         
       
       dejaAttaque=false;
       dejaDeplacee = false;
    }
    
    public Unite(final int pX,final int pY,final int pJoueur, final TypeUnite pType,final int pPV,final int pExperience,final int pLvl,final boolean pDejaAttaque,final boolean pDejaDeplacee)
    {
       super(pX,pY,pJoueur);
       aType = pType;
       aGain = pType.getGain();
       aPVMax = pType.getPVMax();
       if(pPV==0)
        aPV = pType.getPVMax();
       else
        aPV=pPV;
       aDeplacement = pType.getDeplacement();
       aLvl = pLvl;
       aExperience = pExperience;
       isEvolvable = false;
       aExperienceMax=100;
       
       for(TypeAttaque type : TypeAttaque.values()) {
                   
                    if(type.getNom().equals(pType.getAttaque())){
                        aAttaque = type;
                        break;
                    }
                }
            
       aDegats = aAttaque.getDegats();         
       
       dejaAttaque=pDejaAttaque;
       dejaDeplacee = pDejaDeplacee;
    }
	
	public int getLvl(){
        return aLvl;
    }
	
	public void addExperience(final double pExperience){
        aExperience+=(int)pExperience;
        if(aExperience > aExperienceMax && aLvl <3){
            isEvolvable = true;
        }
    }
	
	public boolean isEvolvable(){
        return isEvolvable;
    }
	
	public void upLvl(){
		if(aExperience < aExperienceMax ){
            return;
        }
        else if(aLvl >=3){
             return;
        }
       aLvl++;
       aExperience-=aExperienceMax;
       aPV = (int)(aPV*aGain);
       aDegats = (int)(aDegats*aGain);
       aDeplacement = (int)(aDeplacement*aGain);
    }

	public boolean soigner(int soin)
    {
        if(this.aBesoinDeSoins())
        {
            this.aPV += soin;
            if(aPV>aPVMax){aPV=aPVMax;}
            return true;
        }
        return false;
    }
	
    public int getPorteeDeplacement() {return aPorteeDeplacement;}
	
    public boolean dejaDeplacee() {return dejaDeplacee;}
    public boolean dejaAttaque() {return dejaAttaque;}
    
    public void deplacee(final boolean pBoolean) {dejaDeplacee = pBoolean;}
    public void attaque(final boolean pBoolean) {dejaAttaque = pBoolean;}
   
    public TypeAttaque getAttaque() {return aAttaque;}
    public TypeUnite getType() {return aType;}
    public int getDegat() {return aDegats;}

    public void setPV(final int pPV) {aPV = pPV;}
    public int getPV() {return aPV;}
    public int getPVMax() {return aPVMax;}

    public int getDeplacement() {return aDeplacement;}
    public int getExperience() {return aExperience;}
    public boolean aBesoinDeSoins() {return(aPV<aPVMax);}
}
